home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 23 Character Animation / SkinnedMesh / Shaders / Common.hlsl next >
Text File  |  2016-03-02  |  5KB  |  156 lines

  1. //***************************************************************************************
  2. // Common.hlsl by Frank Luna (C) 2015 All Rights Reserved.
  3. //***************************************************************************************
  4.  
  5. // Defaults for number of lights.
  6. #ifndef NUM_DIR_LIGHTS
  7.     #define NUM_DIR_LIGHTS 3
  8. #endif
  9.  
  10. #ifndef NUM_POINT_LIGHTS
  11.     #define NUM_POINT_LIGHTS 0
  12. #endif
  13.  
  14. #ifndef NUM_SPOT_LIGHTS
  15.     #define NUM_SPOT_LIGHTS 0
  16. #endif
  17.  
  18. // Include structures and functions for lighting.
  19. #include "LightingUtil.hlsl"
  20.  
  21. struct MaterialData
  22. {
  23.     float4   DiffuseAlbedo;
  24.     float3   FresnelR0;
  25.     float    Roughness;
  26.     float4x4 MatTransform;
  27.     uint     DiffuseMapIndex;
  28.     uint     NormalMapIndex;
  29.     uint     MatPad1;
  30.     uint     MatPad2;
  31. };
  32.  
  33. TextureCube gCubeMap : register(t0);
  34. Texture2D gShadowMap : register(t1);
  35. Texture2D gSsaoMap   : register(t2);
  36.  
  37. // An array of textures, which is only supported in shader model 5.1+.  Unlike Texture2DArray, the textures
  38. // in this array can be different sizes and formats, making it more flexible than texture arrays.
  39. Texture2D gTextureMaps[48] : register(t3);
  40.  
  41. // Put in space1, so the texture array does not overlap with these resources.  
  42. // The texture array will occupy registers t0, t1, ..., t3 in space0. 
  43. StructuredBuffer<MaterialData> gMaterialData : register(t0, space1);
  44.  
  45.  
  46. SamplerState gsamPointWrap        : register(s0);
  47. SamplerState gsamPointClamp       : register(s1);
  48. SamplerState gsamLinearWrap       : register(s2);
  49. SamplerState gsamLinearClamp      : register(s3);
  50. SamplerState gsamAnisotropicWrap  : register(s4);
  51. SamplerState gsamAnisotropicClamp : register(s5);
  52. SamplerComparisonState gsamShadow : register(s6);
  53.  
  54. // Constant data that varies per frame.
  55. cbuffer cbPerObject : register(b0)
  56. {
  57.     float4x4 gWorld;
  58.     float4x4 gTexTransform;
  59.     uint gMaterialIndex;
  60.     uint gObjPad0;
  61.     uint gObjPad1;
  62.     uint gObjPad2;
  63. };
  64.  
  65. cbuffer cbSkinned : register(b1)
  66. {
  67.     float4x4 gBoneTransforms[96];
  68. };
  69.  
  70. // Constant data that varies per material.
  71. cbuffer cbPass : register(b2)
  72. {
  73.     float4x4 gView;
  74.     float4x4 gInvView;
  75.     float4x4 gProj;
  76.     float4x4 gInvProj;
  77.     float4x4 gViewProj;
  78.     float4x4 gInvViewProj;
  79.     float4x4 gViewProjTex;
  80.     float4x4 gShadowTransform;
  81.     float3 gEyePosW;
  82.     float cbPerObjectPad1;
  83.     float2 gRenderTargetSize;
  84.     float2 gInvRenderTargetSize;
  85.     float gNearZ;
  86.     float gFarZ;
  87.     float gTotalTime;
  88.     float gDeltaTime;
  89.     float4 gAmbientLight;
  90.  
  91.     // Indices [0, NUM_DIR_LIGHTS) are directional lights;
  92.     // indices [NUM_DIR_LIGHTS, NUM_DIR_LIGHTS+NUM_POINT_LIGHTS) are point lights;
  93.     // indices [NUM_DIR_LIGHTS+NUM_POINT_LIGHTS, NUM_DIR_LIGHTS+NUM_POINT_LIGHT+NUM_SPOT_LIGHTS)
  94.     // are spot lights for a maximum of MaxLights per object.
  95.     Light gLights[MaxLights];
  96. };
  97.  
  98. //---------------------------------------------------------------------------------------
  99. // Transforms a normal map sample to world space.
  100. //---------------------------------------------------------------------------------------
  101. float3 NormalSampleToWorldSpace(float3 normalMapSample, float3 unitNormalW, float3 tangentW)
  102. {
  103.     // Uncompress each component from [0,1] to [-1,1].
  104.     float3 normalT = 2.0f*normalMapSample - 1.0f;
  105.  
  106.     // Build orthonormal basis.
  107.     float3 N = unitNormalW;
  108.     float3 T = normalize(tangentW - dot(tangentW, N)*N);
  109.     float3 B = cross(N, T);
  110.  
  111.     float3x3 TBN = float3x3(T, B, N);
  112.  
  113.     // Transform from tangent space to world space.
  114.     float3 bumpedNormalW = mul(normalT, TBN);
  115.  
  116.     return bumpedNormalW;
  117. }
  118.  
  119. //---------------------------------------------------------------------------------------
  120. // PCF for shadow mapping.
  121. //---------------------------------------------------------------------------------------
  122. //#define SMAP_SIZE = (2048.0f)
  123. //#define SMAP_DX = (1.0f / SMAP_SIZE)
  124. float CalcShadowFactor(float4 shadowPosH)
  125. {
  126.     // Complete projection by doing division by w.
  127.     shadowPosH.xyz /= shadowPosH.w;
  128.  
  129.     // Depth in NDC space.
  130.     float depth = shadowPosH.z;
  131.  
  132.     uint width, height, numMips;
  133.     gShadowMap.GetDimensions(0, width, height, numMips);
  134.  
  135.     // Texel size.
  136.     float dx = 1.0f / (float)width;
  137.  
  138.     float percentLit = 0.0f;
  139.     const float2 offsets[9] =
  140.     {
  141.         float2(-dx,  -dx), float2(0.0f,  -dx), float2(dx,  -dx),
  142.         float2(-dx, 0.0f), float2(0.0f, 0.0f), float2(dx, 0.0f),
  143.         float2(-dx,  +dx), float2(0.0f,  +dx), float2(dx,  +dx)
  144.     };
  145.  
  146.     [unroll]
  147.     for(int i = 0; i < 9; ++i)
  148.     {
  149.         percentLit += gShadowMap.SampleCmpLevelZero(gsamShadow,
  150.             shadowPosH.xy + offsets[i], depth).r;
  151.     }
  152.     
  153.     return percentLit / 9.0f;
  154. }
  155.  
  156.